package cn.com.bluemoon.daps.system.service.impl;

import cn.com.bluemoon.daps.common.domain.ResultBean;
import cn.com.bluemoon.daps.common.enums.BmStatus;
import cn.com.bluemoon.daps.common.toolkit.CheckUtils;
import cn.com.bluemoon.daps.system.entity.DapSystemTag;
import cn.com.bluemoon.daps.system.mapper.DapSystemTagMapper;
import cn.com.bluemoon.daps.system.service.DapSystemTagService;
import cn.com.bluemoon.daps.system.vo.InsertSystemTags;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * <p>
 * 系统标签表 服务实现类
 * </p>
 *
 * @author admin
 * @since 2020-08-03
 */
@Slf4j
@Service
public class DapSystemTagServiceImpl extends ServiceImpl<DapSystemTagMapper, DapSystemTag> implements DapSystemTagService {

    @Autowired
    DapSystemTagMapper dapSystemTagMapper;

    /**
     * 分页列表标签
     * @param pageSize
     * @param pageNum
     * @param key
     * @return
     */
    @Override
    public IPage<DapSystemTag> getTagsPageList(Integer pageSize, Integer pageNum, String key, String tagGroupId, Integer tagType) {

        // 分页条件
        Page<DapSystemTag> pages = new Page<>(pageNum, pageSize);
        LambdaQueryWrapper<DapSystemTag> wrapper = new LambdaQueryWrapper<DapSystemTag>()
                .eq(DapSystemTag::getBmStatus, BmStatus.ON.getCode())
                .orderByDesc(DapSystemTag::getUpdateTime, DapSystemTag::getCreateTime);
        if(StringUtils.isNotBlank(key)){
            wrapper.and(i -> i.like(DapSystemTag::getName,key).or().like(DapSystemTag::getDescription, key));
        }
        if(StringUtils.isNotBlank(tagGroupId)){
            wrapper.eq(DapSystemTag::getTagGroupId, tagGroupId);
        }
        if(tagType != null){
            wrapper.eq(DapSystemTag::getTagType, tagType);
        }
        return dapSystemTagMapper.selectPage(pages, wrapper);
    }

    /**
     * 通过模型id或模型下属表id获得标签列表
     * @param dataId
     * @return
     */
    @Override
    public List<DapSystemTag> getListById(String dataId, Integer relType) {

        List<DapSystemTag> dapSystemTags = dapSystemTagMapper.selectTagList(dataId,relType);
        return dapSystemTags;
    }

    /**
     * 查询新增标签是否重名,标签分组+标签名称 唯一
     * @param dapSystemTag
     * @return
     */
    @Override
    public Boolean checkTagInfo(DapSystemTag dapSystemTag, Boolean isInsert) {

        // 查询当前标签
        List<DapSystemTag> dapSystemTags = getBaseMapper().selectList(new LambdaQueryWrapper<DapSystemTag>()
                        .eq(DapSystemTag::getBmStatus, BmStatus.ON.getCode())
                        .eq(DapSystemTag::getName, dapSystemTag.getName())
                        .eq(DapSystemTag::getTagGroupId, dapSystemTag.getTagGroupId()));
        if(isInsert){
            return dapSystemTags.isEmpty();
        }
        Optional<DapSystemTag> first = dapSystemTags.stream().findFirst();
        return first.isPresent() ? first.get().getId().equals(dapSystemTag.getId()) : true;
    }
}
